import {
	HTTP_REQUEST_URL,
	HEADER,
	TOKENNAME,
	HEADERPARAMS
} from '@/config/app';
import {
	toLogin
} from './login';
import {
	Toast
} from './utils.js';
import store from '../store';
/**  
 * 发送网络请求  
 * @param {string} url - 请求的 API 地址  
 * @param {string} method - 请求方法（默认为 'GET'）  
 * @param {Object} data - 请求数据（默认为空对象）  
 * @param {Object} options - 可选参数，包含 noAuth（是否需要授权）和 params（是否使用特殊 header）  
 * @returns {Promise} - 返回 Promise 对象  
 */
function baseRequest(url, method = 'GET', data = {}, options = {}) {
	const {
		noAuth = false, params = false
	} = options;
	let finalHeader = params ? HEADERPARAMS : HEADER;
	const token = store.state.app.token;
	if (!noAuth && !token) {
		// 如果需要授权但没有 token，则跳转到登录页面  
		toLogin();
		return Promise.reject(new Error('未登录，请登录后重试'));
	}
	if (!noAuth) {
		// 添加 token 到 header 中  
		finalHeader[TOKENNAME] = token;
	}

	return new Promise((resolve, reject) => {
		uni.request({
			url: `${HTTP_REQUEST_URL}${url}`,
			method: method,
			header: finalHeader,
			data: data,
			success: (res) => {
				if (res.statusCode === 200) {
					const {
						code
					} = res.data;
					if (code === 1) {
						resolve(res.data);
					} else {
						Toast(res.data.msg)
						reject(new Error(res.data.msg));
					}
				} else if (res.statusCode === 401) {
					// 处理 token 无效的情况
					toLogin();
					reject(new Error('Token 无效，请重新登录'));
				} else {
					reject(new Error('请求失败'));
				}
			},
			fail: (err) => {
				// 请求失败时的处理  
				reject(new Error(err.message));
			}
		});
	});
}

// 创建请求方法对象  
const requestMethods = ['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'];
const request = {};
requestMethods.forEach((method) => {
	request[method.toLowerCase()] = (api, data, options, params) => {
		return baseRequest(api, method, data, options, params);
	};
});

export default request;